home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0045 / mbmtexte.exe / MBMPAKET.DOC < prev    next >
Text File  |  1992-03-24  |  49KB  |  915 lines

  1. Anleitung zum Maus/Button/Menü Paket für Turbo-Pascal 5.X / 6.X Version 4.1
  2.  
  3. (C) 1990-1992 BY UWE KUHRING
  4.  
  5. Kontakt: Uwe Kuhring
  6.          Scheidter Str. 281
  7.          6602 Dudweiler Saar
  8.          Tel.: 06897/768039
  9.  
  10.          Postgiroamt Saarbrücken
  11.          BLZ 590 100 66
  12.          KNR 522 56 667
  13.          Registrierungsgebühr siehe "PREISE.DOC"
  14.  
  15. ****************************************************************************
  16. * ACHTUNG - WICHTIGE ZUSATZINFORMATION                                     *
  17. * Dies ist die SHARE-Version des MBM-Pakets V4.1                           *
  18. * Da ich Ihnen hierzu trotzdem die Original-Anleitung der Vollversion zur  *
  19. * Durcharbeitung zur Verfügung stellen möchte, werde ich die Abweichungen  *
  20. * zur registrierten Version hier kurz aufführen.                           *
  21. * Der folgende Absatz zum Kopierverbot verliert seine Gültigkeit.          *
  22. * In der Share-Version fehlen die 4 Sources-Codes der 4 Units.             *
  23. * Die Units wurden folgendermaßen eingeschränkt:                           *
  24. * Unit MOUSELIB => keine Einschränkung                                     *
  25. * Unit BUTLIB   => keine Einschränkung                                     *
  26. * Unit MENULIB  => keine Einschränkung                                     *
  27. * Unit WINLIB   => keine Einschränkung                                     *
  28. * Die kommerzielle Nutzung dieses Programmpaketes wird erst durch den      *
  29. * Vorgang der Registrierung vom Autor freigegeben. Sie können jedoch alle  *
  30. * Prozeduren und Units in eigene Programme einbauen und gebührenfrei       *
  31. * erproben. Vor dem Verkauf dieser Programme müssen Sie sich registrieren  *
  32. * lassen, sonst vertreiben Sie mit Ihren Programmen letztlich Raubkopien!  *
  33. ****************************************************************************
  34.  
  35. Zum Urheberrecht: Mit dem Erwerb dieser Vollversion 4.1 des MBM-Pakets
  36. haben Sie ein preisgünstiges Programm zur Gestaltung graphischer
  37. Benutzeroberflächen in Turbo-Pascal erworben. Bitte beachten Sie aber,
  38. daß es sich bei diesem Programm, obwohl es vielleicht der Preis und die
  39. Mitlieferung der Sourcecodes erwarten lassen, nicht um Public-Domain,
  40. sondern um Copyright-geschützte Software handelt. Sie dürfen die Routinen
  41. benutzen, Ihren Erfordernissen anpassen und sie in Ihre Programme einbinden.
  42. Diese Programme können Sie frei verkaufen, ohne daß Lizenzabgaben entstehen.
  43. Untersagt bleibt jedoch die Weitergabe in unkompilierter Form (Source-Codes).
  44. Auch wenn Sie sich entscheiden, bei Ihrem Produkt den Source-Code mit-
  45. zuliefern, dürfen Sie die Source-Codes des MBM-Pakets nicht hinzufügen!
  46. WICHTIG: Als Source-Codes werden hier auch die .TPU Versionen der Libraries
  47. verstanden! Obwohl diese ein Compilat darstellen, sind Sie separat verwend-
  48. bar und bilden so den wesentlichen Teil dieses Programmpaketes. Nur Ihre
  49. .EXE oder .COM Dateien dürfen die Libraries des MBM-Paketes beim Verkauf
  50. enthalten!
  51. Zu den BGI und CHR Dateien: Nach Rücksprache mit Borland habe ich erfahren,
  52. daß es keine Probleme gibt, wenn Sie diese Dateien mit Ihren TP-Programmen
  53. ZUSAMMMEN verkaufen. Diese Programme müssen jedoch einen Hinweis daraufhin
  54. enthalten, daß das Copyright der BGI und CHR Dateien bei Borland liegt.
  55. Diesen Hinweis erteile ich hiermit. Der Verkauf einzelner BGI's und CHR's
  56. ist also NICHT zulässig. Auch kann ich KEINE GARANTIE der Richtigkeit meiner
  57. Behauptung zur lizenskostenfreien Beigabe der BGI und CHR Dateien geben.
  58. Setzten Sie sich im Zweifelsfall besser selbst mit Borland in Verbindung.
  59. P.S.: Ab der Version 3.0 sind nur noch 3 BGI-Dateien als Beigabe enthalten.
  60.       Die Verwendung von DRV_LINK.TPU (s.u.) ist eine bessere Lösung, als die
  61.       Verwendung der separaten BGI-Dateien.
  62.  
  63.  
  64. Haftung: Ich übernehme keinerlei Haftung für Schäden, die durch die
  65. Benutzung des MBM-Paketes in irgendeiner Weise entstehen könnten.
  66. Insbesondere gebe ich keine Garantie der Verwendbarkeit und Funktions-
  67. fähigkeit der beschriebenen Prozeduren, auch wenn dieser Eindruck in der
  68. folgenden Beschreibung der Software entstehen sollte.
  69.  
  70.  
  71. Nun zu den Units und Prozeduren des MBM-Paketes:
  72.  
  73.     Unit        Prozeduren     davon öffentlich       uses
  74.  
  75.    mouselib         7                 7               graph
  76.    butlib           7                 5               graph,mouselib
  77.    menulib         11                10               graph,mouselib
  78.    winlib           9                 8               graph,mouselib,butlib
  79.  
  80. Das Maus/Button/Menü Paket bietet in vier Units insgesamt 30 Prozeduren, die
  81. sowohl den Betrieb der Maus unterstützen, als auch das Implementieren von
  82. Buttons und Menüleisten und Windows auf dem Grafikbildschirm erleichtern.
  83. Die Prozeduren übernehmen die gesamte Handhabung und die Verwaltung der
  84. Buttons, Menüleisten und Menüunterpunkte sowie der Windows.
  85.  
  86. Systemanforderungen:
  87. 1. Eine Grafikkarte aus der Gruppe HGC/CGA/MCGA/EGA/VGA.
  88. 2. Eine (M)CGA-Karte muß den Grafikmodus #(5)4 darstellen können (HiRes).
  89. 3. Natürlich Turbo-Pascal, und zwar ab Version 5.0
  90.    (eventuell sind auch 4.X Versionen verwendbar, dies wurde nicht getestet)
  91.  
  92. Dringend empfohlen wird ferner:
  93. 1. Eine Computermaus, dann aber auch unbedingt mit Treiber.
  94. 2. EGA und VGA Karten ermöglichen eine farbige Darstellung.
  95. 3. Zur Änderung der MOUSELIB (Source-Code) ist wegen den Assembler-Inline-
  96.    Anweisungen eine Turbo-Pascal Version 6.X erforderlich (einz. Ausnahme!)
  97.  
  98. DIE 4 UNITS SIND AUSSCHLIEßLICH IM GRAFIKMODUS EINSETZBAR!
  99.  
  100. Die zum Grafikbetrieb erforderlichen .BGI Grafiktreiber gehören jetzt zum
  101. Lieferumfang, beachten Sie jedoch, daß das Copyright dieser Dateien bei
  102. Borland liegt. Das gleiche gilt für die Datei 'LITT.CHR'. Die BGI's und CHR's
  103. sollten im Hauptverzeichnis zu finden sein, ansonsten muß bei der Proze-
  104. dur der Grafikeinstellung (ENTER_DEFAULT_GRAPHMODE in der MOUSELIB)
  105. die Pfadangabe für die .BGI Dateien vorgegeben werden. Zu diesem Zweck muß
  106. beim Funktionsaufruf INITGRAPH der Leerstring gegen die Pfadangabe ersetzt
  107. werden. Eine bessere Alternative hierzu bietet ab der Version 3.0 das Unit 
  108. 'DRV_LINK.TPU', welches mittels "uses drv_link" in Ihr Programm eingebunden
  109. werden kann. Dann sind stets alle verwendeten Grafiktreiber verfügbar und
  110. obige Probleme entfallen. Ihr Programm wird dadurch allerdings auch einige
  111. KByte länger werden. Ab der Version 3.0 wird die Datei 'LITT.CHR' in keinem
  112. Fall mehr benötigt, wodurch sich der Inhalt der Zusatz-Ordners auf die BGI
  113. Dateien beschränkt.
  114.  
  115. Es folgt eine Beschreibung der vier Units. Auftretende Fehler werden in den
  116. Variablen MOUSEERROR/BUTTONERROR/MENUERROR/WINDOWERROR entsprechend gemeldet.
  117. Die Fehlercodes finden sich ganz am Ende dieser Beschreibung. Wichtig bleibt
  118. dabei anzumerken, daß sich die Variable MOUSEERROR durchaus auch nach einem
  119. Prozeduraufruf aus der Gruppe BUTLIB/MENULIB/WINLIB verändern kann, da diese
  120. ihrerseits die MOUSELIB benutzen!
  121. Die nun folgende Beschreibung erklärt alle Eigenschaften und Fähigkeiten
  122. des MBM-Paketes in den 1.X Versionen. Für Besitzer einer 2.0 Version folgt
  123. am Ende des Textes eine Beschreibung der zusätzlichen Möglichkeiten.
  124. Darauf folgen spezielle Hinweise zur Version ab 3.0 und höher.
  125. In den "*" Kommentaren werden wichtige Änderungen der Versionen ab 3.0 jedoch
  126. schon vorweggenommen.
  127.  
  128. ******************************************************************************
  129. ******************************************************************************
  130.  
  131. Unit MOUSELIB
  132. -------------
  133.  
  134. Folgende Prozeduren stehen zur Verfügung:
  135.  
  136. ***************************
  137. * ENTER_DEFAULT_GRAPHMODE *
  138. ***************************
  139. Eigentlich hat diese Prozedur nichts in der MOUSELIB zu suchen - diese
  140. Library bot sich allerdings an, da sie von allen anderen Libraries benutzt
  141. wird. So steht die Prozedur überall zur Verfügung.
  142. Sie schaltet den Rechner in den Grafikbetrieb und wählt dabei einen für
  143. Menüs und Buttons günstigen Grafikmodus aus. Danach wird noch das
  144. Vorhandensein einer Maus überprüft. Sollte diese fehlen oder kein brauch-
  145. barer Grafikmodus zu finden sein, wird das GESAMTE PROGRAMM mit einer
  146. entsprechenden Meldung ABGEBROCHEN.
  147. Sie können natürlich auch eine eigene Prozedur verwenden, wenn z.B. ein
  148. Programmabbruch in diesen Fällen nicht erwünscht ist, oder Sie einen
  149. ganz bestimmten Grafikmodus auswählen wollen!
  150.  
  151. * Versionen ab 3.0 erlauben auch den Betrieb ohne Maus. Das Programm wird
  152.   in diesem Fall natürlich nicht abgebrochen.
  153.  
  154. **************************************
  155. * MOUSECHECK (var BUTTONS : integer) *
  156. **************************************
  157. Überprüft zunächst, ob ein Grafikmodus ausgewählt wurde. Nur im Grafik-
  158. betrieb macht die Installation von Buttons und ihre Mausbedienung Sinn
  159. (falls man diesen komischen Blockcursor im Textmodus nicht als Mauszeiger  
  160.  huldigt, was mir eher schwer fällt).
  161. Ist dies nicht der Fall, enthält die Variable MOUSEERROR die Zuweisung -1.
  162. Ansonsten wird noch geprüft, ob überhaupt ein Maustreiber zur Verfügung
  163. steht. Falls nicht, wird MOUSEERROR -2 und die Bearbeitung abgebrochen.
  164. Wird hingegen ein Treiber gefunden, wird in BUTTONS die Anzahl der
  165. Knöpfe der installierten Maus und in mouseerror 0 übergeben. Im Fehlerfall
  166. enthält BUTTONS den gleichen Wert wie MOUSEERROR. Diese Prozedur übernimmt
  167. auch die Definition des Mauszeigers. Die dazu benötigten 32 Words werden
  168. in einem unübersehbaren Feld in der Prozedur MOUSECHECK definiert. Sie
  169. können die Werte ändern, um sich einen eigenen Zeiger zu definieren.
  170.  
  171. * Wie bereits erwähnt, bricht das Programm ab der Version 3.0 NICHT ab,
  172.   wenn keine Maus gefunden wurde. In diesem Fall enthält die globale Variable
  173.   MOUSECHECKED den Wert 99, im anderen Fall die Anzahl der Knöpfe der Maus.
  174.  
  175. ***********
  176. * MOUSEON *
  177. ***********
  178. Schaltet die Maus einmal ein. Wurde sie mehrfach ausgeschaltet, muß sie
  179. entsprechend oft wieder eingeschaltet werden, bis sie sichtbar wird.
  180.  
  181. * Ist keine Maus vorhanden macht dieser Befehl - nichts.
  182.  
  183. ************
  184. * MOUSEOFF *
  185. ************
  186. Schaltet die Maus einmal aus. Mehrmaliges Ausschalten wird gespeichert,
  187. was den Betrieb in Prozeduren wesentlich erleichtert.
  188.  
  189. * Dieser Befehl (wie auch die folgenden) macht nichts, wenn keine Maus
  190.   gefunden wurde.
  191.  
  192. ***********************************
  193. * MOUSESTAT (var X,Y,B : integer) *
  194. ***********************************
  195. Übergibt in X die aktuelle X-Koordinate der Maus und in Y die aktuelle
  196. Y-Koordinate. B enthält einen Bitvektor, der sich aus den auf der Maus
  197. gedrückten Tasten zusammensetzt:
  198.  
  199.            linke Taste    : bit 0     gedrückt = 1    ungedrückt = 0
  200.            rechte Taste   : bit 1     gedrückt = 2    ungedrückt = 0
  201.            mittlere Taste : bit 2     gedrückt = 4    ungedrückt = 0
  202.  
  203. Die mittlere Taste steht nicht bei jedem System zur Verfügung.
  204. MOUSEERROR enthält die üblichen Fehlercodes oder 0.
  205.  
  206. * Ist keine Maus vorhanden, enthält die Variable B stets 0 und in X und Y
  207.   sind die Werte von GETMAXX und GETMAXY zu finden.
  208.  
  209. ****************************
  210. * MOUSESET (X,Y : integer) *
  211. ****************************
  212. Dient zum Setzen der Maus an eine bestimmte Position auf dem Grafikbild-
  213. schirm. Dabei müssen sich X und Y in den durch GETMAXX und GETMAXY
  214. vorgegebenen Grenzen befinden. Tun sie das nicht, wird die Maus nicht
  215. bewegt und MOUSERROR erhält die Zuweisung -3. Zusätzlich zu diesem
  216. Fehlercode können die anderen zwei Maus-Fehlercodes auftreten.
  217.  
  218. ***************************************
  219. * MOUSEWINDOW (X1,Y1,X2,Y2 : integer) *
  220. ***************************************
  221. Dient der Definition eines Fensters in das die Maus "eingesperrt" wird.
  222. X1,Y1 definieren die linke obere Ecke und X2,Y2 die rechte untere Ecke
  223. dieses Fensters. Dabei muß gelten:
  224.  
  225.        0 <= X1(Y1) <= X2(Y2) <= GETMAXX(Y)
  226.  
  227. Ansonsten wird MOUSEERROR -3. Die Fehlercode -1 und -2 können auch auftreten.
  228. MOUSEWINDOW (0,0,GETMAXX,GETMAXY) setzt das gesamte Grafik-Fenster.
  229.  
  230.  
  231. Das waren die Maus-Prozeduren. Mittels "uses mouselib" kann die Maus auch
  232. ohne die Button/Menu-Prozeduren verwendet werden, was umgekehrt nicht
  233. möglich ist.
  234.  
  235. *******************************************************************************
  236. *******************************************************************************
  237.  
  238. Unit BUTLIB
  239. -----------
  240.  
  241. Folgende Prozeduren stehen zur Verfügung:
  242.  
  243. *************************************************************
  244. * DEFBUTTON (P,B,X,Y  : integer ; T : string ; S : boolean; *
  245. *            C : char ; U : byte)                           *
  246. *************************************************************
  247. Definiert die Position des Button B durch die Angabe der Koordinaten X und Y.
  248. B muß zwischen 1 und MAXBUTTONS liegen (default=64), während X und Y in den
  249. durch GETMAXX und GETMAXY definierten Grenzen liegen müssen. P definiert die
  250. Button-Ebene, der der Button angehören soll. In der vorliegenden Version
  251. stehen dazu 4 verschieden Ebenen (1..4) zur Verfügung.
  252. In T wird der in den Button einzutragende Text übergeben und wenn S wahr ist,
  253. wird der Button später schattiert gezeichnet werden. In der Variablen C wird
  254. ein zum Mausbetrieb alternativer Buchstabe angegeben. Später kann dieser
  255. Button über die Tastenkombination <ALT> <BUCHSTABE> angeklickt werden.
  256. Zulässig für C sind die Großbuchstaben 'A' bis 'Z' sowie die Zahlen '0' bis
  257. '9'. Soll diese Option nicht verwendet werden, muß C das Leerzeichen ' '
  258. enthalten. U definiert schließlich die Nummer des zu unterstreichenden
  259. Buchstabens im Textstring. So können Sie dem Benutzer mitteilen, welche
  260. <ALT> <?> Kombination einen beliebigen Button anklickt. Lautet Ihr Button-
  261. text z.B. 'Exit' und ist C='X', kann der Exit-Button mit ALT X angeklickt
  262. werden. Dies solltem Sie dem Benutzer mitteilen, indem Sie das X unter-
  263. strichen darstellen (U=2). Wenn U=0 ist, wird kein Buchstabe unterstrichen.
  264.  
  265. Wichtig: Der Button wird durch seine Definition noch nicht gezeichnet.
  266. Wichtig: BUTTONERROR -3 (ungültige Koordinaten) kann auch dann auftreten,
  267.          wenn X und Y zulässige Werte enthalten. In diesem Fall würde der
  268.          Text des Buttons den rechten Rand des Bildschirms überschreiten!
  269. Wichtig: Vergeben Sie auf einer Ebene nicht zweimal die gleiche <ALT> <?>
  270.          Kombination zur Button-Aktivierung! Es würde stets nur der erste
  271.          Button angeklickt werden können.
  272.  
  273. ********************************
  274. * DEFBUTTONPLANE (N : integer) *
  275. ********************************
  276. Aktiviert eine Ebene des Button-Handlers. Alle definierten Buttons dieser
  277. Ebene werden nun gezeichnet. Der Bildschirm wird vorher NICHT automatisch
  278. gelöscht. Die verwendete Zeichenfarbe ist die eingestellte Zeichenfarbe.
  279. Alle Rückgaben der weiteren Prozeduren beziehen sich auf diese Ebene.
  280.  
  281. ************************************************************************
  282. * PRESSEDBUTTON (var BUTTON,MOUSEBUT : integer ; var SCAN_CHAR : char) *
  283. ************************************************************************
  284. Liefert Informationen über die Position des Mauszeigers in der durch
  285. DEFBUTTONPLANE definierten Ebene. Enthält BUTTON 0, so befindet sich der
  286. Mauszeiger über keinem Button der definierten Ebene. Ansonsten enthält
  287. BUTTON die Nummer des Buttons, über dem der Mauszeiger "schwebt".
  288. MOUSEBUT erteilt darüber hinaus Information darüber, welche Maustasten
  289. zur Zeit gedrückt werden. Das Format ist das bei MOUSESTAT beschriebene.
  290. Soll auch die Tastaturbedienung des Buttonhändlers unterstützt werden,
  291. so muß in SCAN_CHAR das nach dem NUL-Zeichen gelesene Zeichen an die Routine
  292. übergeben werden. (Siehe auch MB_DEMO und "ERWEITERTE TASTATURCODES" im
  293. Turbo-Pascal Benutzerhandbuch.)
  294. Hat sich ein Button für dieses Zeichen in SCAN_CHAR für zuständig erklärt,
  295. wird BUTTON entsprechend und MOUSEBUT auf 1 gesetzt. SCAN_CHAR wird dann
  296. das Zeichen CHR(255) zugeschrieben, um die Abarbeitung zu kennzeichnen.
  297.  
  298. ******************************
  299. * REVERTBUTTON (N : Integer) *
  300. ******************************
  301. Invertiert die Farbe des Buttons N in der aktuellen Ebene.  Ein erneuter
  302. Aufruf dieser Funktion stellt den ursprünglichen Zustand wieder her.
  303.  
  304. *****************************************************************
  305. * DEFTEXTBUTTON (P,B,X,Y  : integer ; T : string ; S : boolean; *
  306. *                C : char ; U : byte)                           *
  307. *****************************************************************
  308. Ist der Prozedur DEFBUTTON sehr ähnlich und ruft diese auch auf.
  309. Während DEFBUTTON jede Position auf dem Grafikbildschirm für die Instal-
  310. lation eines Buttons zuläßt, erzeugt die DEFTEXTBUTTON Prozedur eine
  311. Art GOTOXY mit anschließendem WRITE.
  312. Der Vorteil der ersten Funktion liegt in Ihrer beliebigen Anordnungs-
  313. möglichkeit der Buttons, ihr Nachteil in der schlechten Berechenbarkeit
  314. sinnvoller Positionen und vor allem die Abhängigkeit von der verwendeten
  315. Grafikkarte. Die zweite Prozedur ermöglicht hingegen eine "normalisierte"
  316. Ausgabe von Buttons auf dem Bildschirm. Allerdings wird ein Zeichensatz
  317. benötigt, der ein Bildschirmformat von 80x25 Zeichen ermöglicht. Dafür wird
  318. die Abhängigkeit von verwendeten Grafikkarten beseitigt. Entsprechend oberer
  319. Norm muß bei DEFTEXTBUTTON der Wert von Y zwischen 1 und 23 liegen
  320. (entsprechend den Zeilenzahlen 0..24) und der Wert von X zwischen 1 und 78
  321. (entsprechend den Spaltenzahlen 0..79). Die ersten und letzten Zeilen
  322. (Spalten) können wegen der Button-Umrandung nicht genutzt werden.
  323. Des weiteren darf der Wert von X nicht so groß sein, daß mit dem Text das
  324. Zeilenende erreicht würde. Zwischen zwei Buttons sollte eine Leerzeile
  325. liegen, womit in eine Spalte maximal 12 Buttons passen. Zwar ist bei EGA/VGA
  326. Karten eine Anornung in jeder Zeile möglich, dies kann jedoch bei anderen
  327. Karten zu Überlappungen führen.
  328.  
  329. Noch eine wichtige Anmerkung zum Zeichensatz: Die Wahl eines passenden
  330. Zeichensatzes kann u.U. recht mühsam sein. Der Aufruf der Prozedur
  331. ENTER_DEFAULT_GRAPHMODE, der in den Demoprogrammen obligatorisch ist, sollte
  332. stets zum Starten des Grafikmodus eingesetzt werden.
  333.  
  334. Das waren alle 5 (öffentlichen) Prozeduren der BUTLIB.
  335.  
  336.  
  337. ***********************
  338. * CLEAR_EXIST_BUTTONS *
  339. ***********************
  340. Zusätzlich existiert in der BUTLIB noch diese Prozedur, die beim Start der
  341. BUTLIB dafür sorgt, daß alle Buttons zunächst als unbelegt gelten. Ein
  342. späterer Aufruf würde alle Buttons in einem Programm löschen, was keinen
  343. Sinn macht. Für verschiedene Menüs stehen schließlich verschiedene Ebenen
  344. zur Verfügung, wodurch eine Neudefinition einer Ebene unnötig wird.
  345.  
  346.  
  347. *******************
  348. * INIT_SCAN_ARRAY *
  349. *******************
  350. Auch diese Prozedur wird beim ersten Start des Units einmal aufgerufen. Sie
  351. stellt ein Link zwischen SCAN-CODES und ASCII-CODES her und ist durchaus
  352. erweiterbar.
  353.  
  354.  
  355. Sollten 4 Ebenen oder 64 Buttons pro Ebene nicht ausreichen, können diese
  356. Werte im Interface-Teil der BUTLIB erhöht werden. Dazu müssen nur die
  357. Konstanten MAXPLANES und MAXBUTTONS andere Zuweisungen erhalten. Die
  358. Größe der Werte von MAXPLANES und MAXBUTTONS wird nur durch den verfügbaren
  359. Speicher begrenzt.
  360.  
  361. *****************************************************************************
  362. *****************************************************************************
  363.  
  364. Unit MENULIB
  365. ------------
  366.  
  367. *************************
  368. * CLR_ALL_MENUREGISTERS *
  369. *************************
  370. Kennzeichnet alle Menüeintrage als unbelegt, also frei. Dies ist nötig,
  371. damit beim ersten MENUON nicht allerlei Unsinn in den Menüs erscheint.
  372. Die Prozedur kann jedoch auch problemlos zum endgültigen Löschen der
  373. gesamten Menüleiste benutzt werden. (Den Erstaufruf übernimmt das Unit
  374. selbst, ein CLR_ALL_MENUREGISTERS Befehl im Programm ist nicht nötig)
  375.  
  376. *******************************
  377. * CLR (X1,Y1,X2,Y2 : integer) *
  378. *******************************
  379. Löscht einen rechteckigen Ausschnitt des Grafikbildschirmes. Ähnlich wie
  380. bei CLEARDEVICE wird dieser Teil mit der Hintergrungfarbe überschrieben.
  381. x1 und y1 definieren die linke obere und x2 sowie y2 die rechte untere
  382. Ecke dieses Ausschnittes.
  383. Diese Prozedur wird von den Prozeduren der Menügrafikdarstellung benutzt,
  384. kann jedoch auch von außen zum Löschen von Bildschirmteilen genutzt werden.
  385.  
  386. ************************************************
  387. * MENUREGISTER (X,Y : integer ; NAME : string) *
  388. ************************************************
  389. Definiert den Namen des Eintrages in der Spalte X und der Zeile Y. Der
  390. später dort erscheinende Text wird in NAME übergeben.
  391. In der jetzigen Version werden maximal 7 Hauptmenüspalten zugelassen.
  392. Dementsprechend muß X zwischen 1 und 7 liegen, womit die X-te Spalte
  393. angesprochen wird. Y definiert hingegen die Position in der Spalte X, also
  394. die gewünschte Zeile. Es werden maximal 12 Einträge pro Hauptmenüpunkt
  395. zugelassen. So muß also Y zwischen 0 und 12 liegen. Mit 0 wird der Menü-
  396. oberbegriff (der Eintrag in der Hauptmenüzeile) definiert, liegt Y
  397. zwischen 1 und 12 dann die entsprechende Zeile im Menü selbst.
  398. Sowohl Hauptmenüpunkte als auch Unterpunkte können übersprungen werden, so
  399. kann z.B. der Hauptmenüpunkt Nr.7 als erster definiert werden.
  400. Ein Hauptmenüeintrag darf bis maximal 8 Zeichen, ein Untermenüeintrag jedoch
  401. bis zu 16 Zeichen lang sein. Wird in NAME ein Nullstring übergeben, wird
  402. der entsprechende Eintrag aus dem Menü gelöscht.
  403.  
  404. **********
  405. * MENUON *
  406. **********
  407. Stellt das bis dato mittels MENUREGISTER definierte Menü auf dem Grafik-
  408. bildschirm dar. Dabei werden die oberen 4% des Bildschirmes ausgenutzt.
  409. Darunter liegende Informationen gehen verloren. Es werden (logischerweise)
  410. nur Hauptmenüpunkte dargestellt. So nützt es wenig, wenn alle 12 Untermenü-
  411. einträge eines Menüs definiert wurden, aber noch kein Hauptmenüeintrag.
  412. Dieses Menü erscheint nicht und wird später bei 'vernünftiger' Program-
  413. mierung unzugänglich bleiben.
  414. ACHTUNG: Sollte es aus irgendeinem Grund nötig sein, das Menü während
  415.          seines Betriebes zu verändern, sollte zunächst MENUOFF mit
  416.          anschließendem MENUON genutzt werden, um den gewünschten
  417.          Effekt der Aktualisierung zu erreichen.
  418.  
  419. ***********
  420. * MENUOFF *
  421. ***********
  422. Schaltete das aktuelle Menü vollständig ab. Die Menüleiste wird gelöscht
  423. und die meisten Menüprozeduren verweigern Ihren Dienst. Diese Aufrufe
  424. führen dann zu MENUERROR=-10 (Menü ist nicht eingeschaltet).
  425.  
  426. ******************************
  427. * MENUMARK (X,Y,Z : integer) *
  428. ******************************
  429. Zusätzlich zum Menünamen kann im Menü eine Markierung des entsprechenden
  430. Eintrages erscheinen. Mit X und Y wird der gewünschte Eintrag, wie unter
  431. MENUREGISTER beschrieben, angesprochen. Z enthält eine Zahl zwischen 0
  432. und 2, welche die gewünschte Markierungsart festlegt. 0 bedeutet dabei keine
  433. Markierung bzw. Markierung löschen, falls des Menü gerade heruntergeklappt
  434. ist. Diese Markierung (also keine Markierung) wird auch jedem neu definier-
  435. tem Eintrag als erstes zugewiesen. Ist Z=1 dann wird der Menüeintrag als
  436. unzugänglich gekennzeichnet. Dann erscheint links vom Menüeintrag das Symbol
  437. der leeren Menge, um diesen Zustand zu kennzeichnen. Ein solcher Eintrag ist
  438. nun tatsächlich aus dem Menü verschwunden. Zwar wird er beim Herunterklappen
  439. des Menüs noch angezeigt, aber die Prozedur MENUSTAT behandelt diesen
  440. Eintrag wie einen nicht definierten. Dieses Verhalten ermöglicht ein
  441. äußerst simples und effektives Verfahren, um von einem Programm eine Demo-
  442. version zu erzeugen: Es braucht nur ein wichtiger Menüeintrag nach seiner
  443. Definition als unzugänglich gezeichnet werden, schon ist es dem Anwender
  444. unmöglich, diesen Punkt aufzurufen. Dazu sollte noch aus dem entsprechenden
  445. Programmteil eine wichtige Zeile gelöscht werden. Schon diese zwei Aktionen
  446. liefern sowohl Betriebssicherheit, als auch relativ guten Schutz vor Hackern.
  447. Mit Z=2 wird ein Menüeintrag als aktiviert gekennzeichnet (mit einem Haken).
  448. Im Gegensatz zur vorherigen Markierung hat diese keinerlei Einfluß auf
  449. weitere Prozeduren und dient nur der Übersichtlichkeit.
  450.  
  451. **************************
  452. * MENUPULL (N : integer) *
  453. **************************
  454. Klappt das mit N definierte Menü herunter. N muß zwischen 1 und 7 liegen
  455. und damit ein Menü beschreiben, welches mindestens 1 Eintrag enthalten
  456. muß. Ein nur aus seinem Namen bestehendes Menü kann nicht heruntergeklappt
  457. werden. Alle unter dem Menükasten liegenden Bildschirminformationen (das
  458. sind bis zu 16% des Bildschirmes) werden gesichert. Es werden alle
  459. definierten Einträge und Markierungen dieses Menüs sichtbar.
  460. Da immer nur ein Menü zur gleichen Zeit heruntergeklappt sein darf, führt
  461. diese Prozedur in dem Fall, daß bereits ein Menü heruntergeklappt ist,
  462. zunächst ein MENUPUSH aus und klappt anschließend das gewünschte Menü
  463. herunter.
  464.  
  465. ************
  466. * MENUPUSH *
  467. ************
  468. Da stets höchstens ein Menü heruntergeklappt ist, ist eine weitere Angabe
  469. von Parametern für diese Prozedur unnötig.
  470. Die Prozedur klappt das momentan heruntergeklappte Menü wieder hoch. Die
  471. vor dem Herunterklappen des Menüs gesicherten Bildschirminformationen werden
  472. restauriert, womit der Bildschirm wieder so aussieht, wie vor dem Aufruf von
  473. MENUPULL. (Es sei denn, man verändert während ein Menü heruntergeklappt ist,
  474. den Bildschirm, was man tunlichst unterlassen sollte!)
  475.  
  476. ****************************************************************
  477. * MENUSTAT (var X,Y,MOUSEBUT : integer ; var SCAN_CHAR : char) *
  478. ****************************************************************
  479. Liefert Informationen über die Positionen des Mauszeigers (der sichtbar sein
  480. sollte => MOUSEON benutzen) bezüglich des aktuell dargestellten Menüs.
  481. MOUSEBUT ist absolut funktionsgleich mit MOUSEBUT bei der MOUSELIB-Prozedur
  482. MOUSESTAT. SCAN_CHAR wird wie bei der PRESSED_BUTTON Routine in der
  483. BUTLIB zur Tastaturbedienung der Menüleiste benutzt. Sehen Sie sich bitte
  484. die Anleitung dieser BUTLIB-Prozedur nocheinmal an. Sie sollten aber auch
  485. unbedingt das kurze Kapitel über die erweiterten Tastaturcodes in den TP-
  486. Handbüchern lesen. Auch die Demo-Programme MB_DEMO und MENUDEMO zeigen,
  487. wie SCAN_CHAR verwendet werden kann.
  488. Nach dem Aufruf:
  489. Y und X geben die Zeile und Spalte wieder, über der sich der Mauszeiger
  490. zur Zeit befindet. Da nur die Spalten 1 bis 7 definiert sind, bedeutet eine
  491. 0 in X nach dem Aufruf dieser Prozedur, das sich die Maus über keinem
  492. anwählbaren Eintrag befindet. Dabei ist auch stets Y=0, woraus man leicht
  493. folgern kann: Dann und nur dann wenn (X+Y)>0 steht der Mauszeiger über einem
  494. anwählbaren Eintrag. Da man jedoch aus X=0 nur folgern kann, daß die Maus
  495. über keinem ANWÄHLBAREN Eintrag steht, kann man ein heruntergeklapptes
  496. Menü deshalb nicht einfach wieder hochklappen. Der Mauszeiger könnte auf
  497. einem leeren oder unzugänglichen Eintrag stehen und das Menü würde plötzlich
  498. verschwinden. In diesem Fall hilft die nach jedem Aufruf von MENUSTAT
  499. aktualisierte Variable MENULEFT, die immer dann wahr (true) ist, wenn sich
  500. der Mauszeiger über keinem Menükasten oder über einem nicht zum aktuell
  501. heruntergeklappten Menükasten gehörenden Menüpunkt befindet. In diesem
  502. Zusammenhang sollen einmal alle weiteren Variablen, die zusätzliche
  503. wichtige Informationen liefern können beschrieben werden:
  504.  
  505. 1. MENUERROR  : Fehlervariable, siehe Ende dieser Beschreibung.
  506. 2. MENULEFT   : Ist im obigen Text gerade beschrieben worden.
  507. 3. MENUPULLED : Enthält die Nummer des gerade heruntergeklappten Menüs
  508.                 oder 0, wenn kein Menü heruntergeklappt ist.
  509. 4. REVERTED   : Enthält die Nummer des gerade invertierten Menüuntereintrages
  510.                 oder 0, falls kein Untereintrag invertiert ist.
  511. 5. MENUVIEW   : Ist wahr (true) wenn MENUON als letztes aufgerufen wurde,
  512.                 bzw. unwahr (false) nach MENUOFF oder dem Start des Units.
  513. 6. KEY_MODE   : Ist wahr, wenn das aktuell heruntergeklappte Menu von der
  514.                 Tastatur aktiviert wurde und die Maus das Menü noch nicht
  515.                 übernommen hat.
  516.  
  517. *********************************
  518. * MENUREVERT (N,MODE : integer) *
  519. *********************************
  520. Invertiert (kennzeichnet mit invertierten Farben) den Untereintrag mit der
  521. Nummer N im aktuell heruntergeklappten Menü.
  522. Dazu muß sowohl ein Menü heruntergeklappt sein, als auch der gewünschte
  523. Eintrag existieren, d.h. definiert sein. Da kein Haupteintrag invertiert
  524. werden kann, muß N zwischen 1 und 12 liegen.
  525. Es kann immer nur höchstens ein Eintrag invertiert sein. Wird mit N ein
  526. anderer als bereits im Menü invertierter Eintrag angegeben, so wird zunächst
  527. der alte Eintrag wieder auf 'normale' Färbung gebracht.
  528. Ist MODE=1 dann wird der Eintrag wie beschrieben durch Invertierung von den
  529. anderen Einträgen abgehoben.
  530. Ist MODE hingegen =0 wird der Eintrag wieder auf 'normale' Färbung gebracht.
  531. Während es bei MODE=1 wichtig ist, welcher Eintrag mit N gekennzeichet ist,
  532. ist bei MODE=0 diese Angabe durch Eindeutigkeit eigentlich unnötig. Trotzdem
  533. muß N den formalen Bedingungen genügen, ansonsten ist sein Inhalt nicht
  534. von Bedeutung. MENUREVERT(1,0) stellt also in jedem Fall den Menükasten
  535. wieder ohne Invertierungen dar.
  536.  
  537. Das war die Beschreibung der 10 (öffentlichen) MENULIB-Prozeduren.
  538.  
  539. *************************
  540. * REVERT (N : integer); *
  541. *************************
  542. Diese zusätzliche nicht-öffentliche Prozedur übernimmt den eigentlichen
  543. Invertiervorgang. Da diese Funktion weder Bereichsprüfungen vornimmt,
  544. noch irgendeinen weitergehenden Sinn hat, ist ihre Unterbringung im
  545. Implementationsteil am sinnvollsten.
  546.  
  547. *******************************************************************************
  548. *******************************************************************************
  549.  
  550. Verbesserungen in der Version 2.0
  551. ---------------------------------
  552.  
  553. Diese Version wurde in zweierlei Hinsicht erweitert. Zunächst können nun
  554. 16 Untermenüs verwaltet werden, anstatt nur maximal 12 Untermenüs.
  555. Die ganz wesentliche Erweiterung ist jedoch die Möglichkeit, Buttons und
  556. Menüs jetzt farbig zu gestalten. Die Programme des MBM-Paketes erkennen
  557. selbstständig die Grafik-Karte und stellen die Menüs und Buttons bei
  558. HGC, CGA und MCGA schwarz/weiß und bei EGA/VGA-Karten farbig dar.
  559. Dabei kann für jedes Untermenü bzw. jeden Button eine beliebige von 16
  560. Farben ausgewählt werden.
  561. Falls Sie nun befürchten, Ihre Programme umschreiben zu müssen, um Farbe
  562. in die Menüs zu bekommen, kann ich Sie beruhigen. Es ist nämlich nicht
  563. notwendig die Programme umzuschreiben; nur wenn Sie eigene Farben setzen
  564. wollen, ist eine ERGÄNZUNG Ihrer Programme um eine oder zwei Prozeduren
  565. erforderlich, die anderen Prozeduren bleiben unverändert!
  566. Die Vorgehensweise:
  567. Wenn Sie die ENTER_DEFAULT_GRAPHMODE Prozedur der Mouselib verwenden, sind
  568. Ihre Menüs und Buttons bei EGA- und VGA-Karten automatisch farbig. Sollten
  569. Sie jedoch mit einer eigenen Routine den Grafik-Modus einschalten, müssen
  570. Sie die Variable VGA_EGA_CARD unbedingt selbst setzen. Sollte Ihr System
  571. über eine EGA- oder VGA-Karte verfügen, ist dazu die Anweisung
  572. VGA_EGA_CARD := true;
  573. ansonsten jedoch die Anweisung
  574. VGA_EGA_CARD := false;
  575. in die ersten Anweisungen Ihres Programmes (vor Menü- und Button-Aufrufen)
  576. einzufügen. Wird diese Zuweisung fortgelassen, ist der Inhalt der Variablen
  577. VGA_EGA_CARD nicht definiert und das MBM-Paket arbeitet fehlerhaft!
  578. Setzen Sie hingegen VGA_EGA_CARD grundsätzlich auf FALSE, dann arbeitet
  579. die Version 2.0 stets so, wie Ihre 1.X Vorgänger, also farblos.
  580. Benutzer der ENTER_DEFAULT_GRAPHMODE Prozedur können die Variable jedoch,
  581. wie bereits erwähnt, getrost vergessen.
  582. An den Parametern und Deklarationen der Prozeduren der drei Units ändert
  583. sich nichts. Die Farbe von Menüs und Buttons wird vielmehr über 2 Felder
  584. definiert. Da die Felder öffentlich sind, können sie Sie aus Ihrem Programm
  585. heraus manipulieren.
  586. Die Farbe von Menüs wird in dem Feld COLOR_ARRAY [A,B] definiert.
  587. A darf zwischen 0 und 7 liegen und bezeichnet im Falle von A=0 das Haupt-
  588. menü und im Falle von A=1 bis A=7 das entsprechende Untermenü.
  589. Mit B legen Sie fest, für welchen Teil der Anzeige Sie die Farbe definieren
  590. wollen:
  591.         B=0  =>  Die Farbe für den Menühintergrund
  592.         B=1  =>  Die Farbe für den Menürahmen
  593.         B=2  =>  Die Farbe für die Menütexteinträge
  594.         B=3  =>  Die Farbe für die Menümarkierungen
  595.  
  596. Mit der Anweisung "COLOR_ARRAY [0,0] := 4 ;" legen Sie die Hintergrundfarbe
  597. des Haupmenüs auf Rot fest und mit "COLOR_ARRAY [5,3] := 14 ;" erreichen
  598. Sie, daß alle Markierungen des 5. Untermenüs in Gelb dargestellt werden.
  599. (Siehe auch TP-Handbuch unter Graph: Frabkonstanten).
  600.  
  601. Die Farbe der Buttons wird ganz ähnlich gehandhabt, nur daß hier jeder
  602. Button seine eigene Farbe bekommen kann.
  603. Bei den Buttons ist es das Feld BUTTON_COLORS, welches die Farbinformation
  604. der Buttons beinhaltet. Eine mögliche Anweisung wäre:
  605. BUTTON_COLORS [A,B,C] := MEINE_FARBE ;
  606. wobei A die Buttonebene beschreibt und somit zwischen 1 und 4 liegen darf.
  607. B definiert den angesprochenen Button der Ebene A und C legt wieder fest,
  608. für welchen Teil des Buttons die Farbe gesetzt wird:
  609.  
  610.     C=0     => Die Farbe des Button-Hintergrundes
  611.     C=1     => Die Farbe der Button-Umrahmung
  612.     C=2     => Die Farbe des Button-Textes
  613.  
  614. Beispiele:
  615.  
  616. BUTTON_COLORS [1,1,0] := 6 ;
  617. BUTTON_COLORS [1,1,1] := 11 ;
  618. BUTTON_COLORS [1,1,2] := 7 ;
  619.  
  620. Diese Kombination legt den Hintergrund des Buttons 1 der Ebene 1 auf braun,
  621. den Rahmen des Buttons auf helltürkis und die Textfarbe auf hellgrau fest.
  622.  
  623. Es ist natürlich wichtig, daß Sie alle Farb-Definitionen der Buttons und
  624. Menüs vornehmen, BEVOR Sie sie anzeigen lassen, sonst wird immer die
  625. Standard-Farbe verwendet werden.
  626.  
  627. Sollten noch immer Unklarheiten bestehen: Experimentieren Sie etwas mit den
  628. Programmen MB_DEMO.PAS und MENUDEMO.PAS und alles sollte klar werden.
  629.  
  630. *******************************************************************************
  631. *******************************************************************************
  632.  
  633. Verbesserungen in der Version 3.0
  634. ---------------------------------
  635.  
  636. Die völlig neu überarbeitete Version 3.0 enthält entscheidende Änderungen
  637. gegenüber ihren Vorgängern:
  638.  
  639. 1. Der unschöne Vektorzeichensatz bei HGC/CGA/MCGA wird nicht mehr verwendet.
  640.    Sollten bei diesen Karten eventuell einige Zeichen (ß,ä,ü,ö usw.) fehlen,
  641.    so ist "GRAFTABL" (DOS-Befehl) vor dem (ersten) Programmstart von DOS aus
  642.    aufzurufen. Noch besser ist der Einbau von "GRAFTABL" in Ihre AUTOEXEC.BAT
  643.    Datei.
  644. 2. Das Unit "DRV_LINK.TPU" ermöglicht das Einbinden der 3 benötigten Grafik-
  645.    treiber (BGI-Dateien) in jedes Turbo-Pascal Programm.
  646. 3. Eine Maus ist nicht erforderlich (aber wünschenswert), denn die Buttons und
  647.    Menüs können auch über die Tastatur gesteuert werden. Somit erfolgt bei
  648.    fehlender Maus kein Programmabbruch mehr.
  649. 4. Die Prozeduren der Mouselib nutzen die Möglichkeiten von Turbo-Pascal 6.0
  650.    zum direkten Einbinden von Assembler-Quell-Code.
  651. 5. Buttons sind nicht nur mit der Maus, sondern auch über <ALT> <?> Tastatur-
  652.    kommandos zu aktivieren. Das Verfahren ist optional.
  653. 6. Die Daten des Buttonhandlers werden nun nicht mehr im Datensegment,
  654.    sondern über Pointer dynamisch auf dem Heap verwaltet. Somit entfällt der
  655.    unerfreuliche Zugriff des Buttonhandlers auf ca. 1/3 des Datenspeichers.
  656. 7. Hauptmenüs können über die Tastenkombination <ALT> <Fn> heruntergeklappt
  657.    werden, wobei n zwischen 1 und 8 liegen muß und den gewünschten Hautein-
  658.    trag angibt. Ist n=8 wird jedes Menü wieder eingeklappt.
  659.    Ist ein Menü heruntergeklappt, kann mit den Cursortasten ein Eintrag
  660.    ausgewählt und mit Return auch aktiviert werden.
  661. 8. Auch bei der Menübedienung hat die Maus Vorrang, d.h. man kann mit der
  662.    Maus ein von der Tastatur aktiviertes Menü übernehmen.
  663. 9. Ein viertes Unit (WINLIB) ermöglicht das Abwickeln von Text-Ein/Ausgaben
  664.    in Fenstern, woduch in Verbindung mit Buttons und Menüs keinerlei direkte
  665.    Ausgabe von Texten auf dem Grafikbildschirm erforderlich ist. Dieser steht
  666.    somit für Grafik (oder auch nur Hintergrund) zur Verfügung.
  667.  
  668. Verbesserungen in der Version 3.1
  669. ---------------------------------
  670.  
  671. Einige Bugs (bzw. Unschönheiten) der Version 3.0 konnten beseitigt werden:
  672.  
  673. 1. "WPRINT" (Winlib) mit einem leeren String funktioniert jetzt ordentlich,
  674.    was bedeutet, daß nichts geschieht. Der Bildschirm wird in diesem Fall
  675.    also nicht mehr mit einem wilden Muster gefüllt.
  676. 2. Wird "PRESSEDBUTTON" (Butlib) ohne Maustreiber und nur mit Tastatur-
  677.    bedienung aufgerufen, wird nun "MOUSEBUT" auch auf Null gesetzt, wenn
  678.    kein <RETURN> gedrückt wurde und nicht einfach der alte Wert zurück-
  679.    geliefert.
  680.  
  681. Das waren die Bugs - es folgen die beseitigten Unschönheiten:
  682.  
  683. 1. Auch bei diesem Shareware-Programm kann man jetzt (wie bei meinen anderen
  684.    Programmen) mit <ESC> ein Menü wieder hochklappen.
  685. 2. Die graue "Schriftunterlage" der Window-Überschriften wird im dem Fall,
  686.    daß sie mit seitlichen Überständen zu lang würde, auf die Schriftgröße
  687.    angepaßt und nicht einfach weggelassen.
  688. 3. Wird als Window-Überschrift ein Leerstring angegeben, wird jetzt nicht
  689.    mehr ein kleines Stück "Schriftunterlage" in der oberen Leiste angezeigt,
  690.    sondern die Umrandung des Fensters durchgehend gestaltet.
  691.  
  692. Dazu kommen ein paar kleine Erweiterungen
  693.  
  694. 1. Durch Setzen der Winlib-Variablen SCREEN_SAVE auf FALSE (Default = TRUE)
  695.    können bel. große Fenster geöffnet werden. Das funktioniert deshalb, weil
  696.    der Hintergrund dann NICHT gesichert wird. Daraus folgt aber auch, daß
  697.    nach CLOSE_WINDOW der Bildschirm nicht wieder restauriert wird. Auf dem
  698.    Bilschirm passiert sogar offensichtlich überhaupt nichts. Trotzdem muß
  699.    CLOSE_WINDOW aufgerufen werden, damit die Window-Handle-Nummer wieder
  700.    freigegeben werden kann. Diese Möglichkeit ist von Nutzen, wenn für ein
  701.    Programm ein großes Fenster im Hintergrund geöffnet wird, welches bis zum
  702.    Programmende nicht wieder geschlossen wird. Vergessen Sie nicht, die
  703.    Variable SCREEN_SAVE nach dem Öffnen dieses Windows wieder auf TRUE zu
  704.    setzen, damit sich die weiteren Fenster "normal" verhalten.
  705. 2. Das Programm MENUDEMO.EXE wurde leicht ergänzt.
  706. 3. Das neue Programm WINDEMO.EXE demonstriert ein wenig die Möglichkeiten
  707.    der Winlib, allerdings mit SCREEN_SAVE = FALSE. Es wäre allerdings auch
  708.    ziemlich unmöglich, mehrere tausend Window-Inhalte von Grafik-Windows
  709.    zu speichern, ohne eine ganze Festplatte damit vollzupacken.
  710.  
  711. Zur Version 3.2
  712. ---------------
  713.  
  714. Da beim aktuell verwendeten Zeichensatz bei HGC-Karten 90 Zeichen in eine
  715. Zeile passen, wurde in der Winlib auch die Möglichkeit eröffnet, Fenster mit
  716. einer Breite bis zu 88 Textzeichen zu öffnen.
  717. Die Text-Ausgabe in Windows erfolgt bei HGC-Karten dieser Option angepasst.
  718. Für alle anderen Grafik-Karten ändert sich jedoch nichts !
  719.  
  720. Zur Version 3.3
  721. ---------------
  722.  
  723. Man kann jetzt Fenster, die sich horizontal über den ganzen Bildschirm
  724. erstrecken, auch wieder schließen. Open_Window, Clear_Window und WPrint
  725. arbeiten ca. 3 mal so schnell wie in den vorherigen Versionen. Wird für
  726. den Rahmen die gleiche Farbe wie für den Fenster-Hintergrund angegeben,
  727. wird dieser nicht durch ein Muster hervorgehoben.
  728. Die Schattenfarbe der Buttons ist ab jetzt genau wie bei allen anderen
  729. Objekten schwarz. Geöffnete Menüs erzeugen ab dieser Version ebenfalls einen
  730. Schatten. Nach den Buttons wird nun auch der Speicherbedarf der Menulib
  731. teilweise dynamisch verwaltet. Dadurch gibt es aber auch einen neuen
  732. möglichen Fehlercode: -15 für "zuwenig Speicher".
  733.  
  734. *******************************************************************************
  735. *******************************************************************************
  736.  
  737. Die WINLIB der Versionen 3.X
  738. ----------------------------
  739.  
  740. **************************************************
  741. * OPEN_WINDOW (X0,Y0,X1,Y1,C,B: integer ;        *
  742. *              var N : integer ; TITLE : string) *
  743. **************************************************
  744. Öffnet ein Fenster mit der linken oberen Ecke in X0 und Y0 und der rechten
  745. unteren Ecke in X1 und Y1. Diese Koordinaten beschreiben Textpositionen und
  746. sind nicht etwa pixelorientiert. Außerdem definieren die Koordinaten die
  747. beschreibbare Fläche - die Umrandung ist jeweils 1 Zeichen breiter. Die
  748. X-Koordinaten müssen zw. 1 und 78 und die Y-Koordinaten zw. 1 und 23 liegen.
  749. C definiert die Rahmenfarbe und B die Farbe des Fensterhintergrundes.
  750. Die Prozedur liefert in N eine Nummer zurück, über die das Fenster in Zukunft
  751. angesprochen werden kann. Mit TITLE wird definiert, welche Überschrift das
  752. Fenster tragen soll.
  753. Es können maximal 10 Fenster gleichzeitig geöffnet sein. Die Fenster müssen
  754. in umgekehrter Öffnungsfolge wieder geschlossen werden, außer wenn jede
  755. Form von Fenster-Überlappung ausgeschlossen werden kann.
  756. ACHTUNG: Der unter einem Fenster liegende Hintergrund darf maximal 65000
  757.          Bytes Speicher zur Sicherung erfordern. Ist der Bedarf größer,
  758.          wird das Fenster nicht geöffnet! Der maximale Speicherbedarf bei
  759.          Karten bis VGA und bis 480*640 Pixel bei 16 Farben beträgt:
  760.          (X1-X0+3)*(Y1-Y0+3)*80 Bytes, so daß bei diesen Karten ein einzelnes
  761.          Fenster höchstens ca. 1/3 des Bildschirmes überdecken darf.
  762.  
  763. ******************************
  764. * CLOSE_WINDOW (N : integer) *
  765. ******************************
  766. Schließt ein zuvor geöffnetes Fenster wieder. Die unter dem Fenster liegende
  767. Bildschirminformation wird dabei restauriert. Mit N muß der Prozedur die
  768. von OPEN_WINDOW zurückgelieferte Nummer übergeben werden.
  769.  
  770. ***********************************************
  771. * WPRINT (N,X,Y,COLOR : integer ; S : string) *
  772. ***********************************************
  773. Gibt den Text im String S im Fenster mit der Nummer N aus. Der Text wird an
  774. den Positionen X und Y ausgegeben. Diese Koordinaten beziehen sich auf den
  775. Ursprung des Fensters und nicht etwa auf den des Bildschirmes. Somit ist
  776. bei einer späteren Verschiebung des Fensters keine Änderung der Ausgabe-
  777. befehle erforderlich. COLOR definiert die Farbe des Textes. Dieser muß in
  778. das Fenster "passen", sonst wird er nicht ausgegeben.
  779.  
  780. *****************************************************
  781. * WINPUT (N,X,Y,COLOR : integer ; var OUTS: string) *
  782. *****************************************************
  783. Ermöglicht dem User im Fenster mit der Nummer N an den Positionen X und Y
  784. die Eingabe eines Textstringes. Der Textstring wird in der Farbe COLOR im
  785. Fenster dargestellt und in der Variablen OUTS an die aufrufende Prozedur
  786. übergeben. Auch Zahlen werden in einem String zurückgegeben.
  787.  
  788. ******************************
  789. * CLEAR_WINDOW (N : integer) *
  790. ******************************
  791. Löscht den Inhalt des Fensters mit der Nummer N vollständig. Das Fenster wird
  792. also mit seiner definierten Hintergrundfarbe überschrieben.
  793.  
  794. ***************************
  795. * WREVERT (N,Y : integer) *
  796. ***************************
  797. Invertiert im Fenster mit der Nummer N den Y. Eintrag in diesem Fenster auf
  798. voller Länge. Ein erneuter Aufruf der Funktion mit den gleichen Parametern
  799. stellt den ursprünglichen Zustand wieder her.
  800.  
  801. ************************************************************************
  802. * WINDOW_STAT (N : integer ; var Y,B : integer ; var SCAN_CHAR : char) *
  803. ************************************************************************
  804. Erteilt der aufrufenden Prozedur Informationen über das Fenster mit der
  805. Nummer N. In Y wird mitgeteilt, über welchem Eintrag des Fensters sich der
  806. Mauszeiger befindet und B spiegelt den Status der Mausknöpfe im üblichen
  807. Format wieder. Damit dieser Vorgang auch ohne Maus über die Tastatur
  808. funktioniert, muß wie bei den anderen Libraries in SCAN_CHAR der 2. Wert
  809. des erweiterten Tastaturcodes oder CHR(13) übergeben werden.
  810.  
  811. Das waren die öffentlichen Prozeduren der WINLIB.
  812. Zusätzlich verfügt auch die Winlib über eine CLR-Prozedur zum partiellen
  813. Löschen des Grafikbildschirmes. Diese Prozedur ist darüber hinaus ohne jede
  814. Bedeutung.
  815.  
  816. *****************************************************************************
  817. Veränderungen und Erweiterungen ab V4.0
  818. *****************************************************************************
  819.  
  820. Zur Version 4.0
  821. ---------------
  822.  
  823. Am MBM-Paket selbst wurde (fast) nichts geändert: Daß der Mauszeiger nicht
  824. ganz sauber ist (oberer Teil der AND-Maske falsch definiert) gehört nun der
  825. Vergangenheit an.
  826.  
  827. Wesentlicher ist die komplette Eingliederung der Sprite-Library V1.2 in das
  828. MBM-Paket. Diese Pascal-Routinen sind eigentlich weniger für schnellbewegte
  829. Sprites, als vielmehr für das Konstruieren und Anzeigen von Images von
  830. Bedeutung. Alles weitere entnehmen Sie bitte der Beschreibung für die
  831. Sprite-Library selbst.
  832.  
  833. Da sich DRV_Link durchgesetzt hat, wurde ab der Version 4.0 vollständig auf
  834. die Beigabe der BGI-Treiber verzichtet. Wer Sie dennoch benutzen möchte,
  835. findet Sie auf den originalen Pascal-Disketten.
  836.  
  837.  
  838. Zur Version 4.1
  839. ---------------
  840.  
  841. Wesentlichster Grund für die Erstellung einer neuen Version war die Not-
  842. wendigkeit, meine neue Adresse in das Programm einzubauen. Damit jedoch
  843. auch ein echter Nutzen für den Anwender dabei herausspringt, wurde das
  844. Programm-Paket dabei gleich noch ein wenig ausgebaut.
  845.  
  846. Die Winlib erhielt dabei eine neue Prozedur, die es dem Programmierer
  847. ermöglicht, dem Anwender schnell eine Mitteilung in einem Fenster zu
  848. übermitteln. Dazu muß nicht erst groß ein Fenster geöffnet und mit
  849. WPrint-Anweisungen beschrieben werden. Es geht viel einfacher:
  850.  
  851. **********************************************
  852. * INFO_WINDOW (C : char ; S1,S2,S3 : string) *
  853. **********************************************
  854.  
  855. Die Nummer des Windows ermittelt die Prozedur selbst. Das Fenster wird
  856. automatisch zentriert. Das Zeichen in C wird in der linken oberen Ecke des
  857. Fensters besonders hervorgehoben (z.B. ein "!" oder ein "?").
  858. S1, S2 und S3 sind drei Strings von maximal je 30 Zeichen Länge, die im
  859. Fenster untereinander dargestellt werden.
  860. Der Anwender kann das Fenster durch Druck auf den "OK"-Button wieder
  861. schließen. Sie als Programmierer müssen sich dabei um nichts kümmern.
  862. Die Prozedur meldet sich erst nach der Quittierung durch den Anwender
  863. und dem automatischen Schließen des Info-Fensters in Ihrem Programm zurück.
  864.  
  865. ----------------------------------------------------------------------------
  866.  
  867. Mit dem MBM-Paket V4.1 verfügen Sie über etliche Prozeduren, die die
  868. Erstellung von Programmen in Pascal für den Grafikmodus wesentlich
  869. erleichtern. Viel Spaß dabei.
  870.  
  871. *****************************************************************************
  872. *****************************************************************************
  873.  
  874.  
  875. Hier kommen nun noch alle möglichen Fehlercodes:
  876.  
  877. Error     bei        bei        bei
  878. Nummer MOUSEERROR BUTTONERROR MENUERROR        Beschreibung
  879.  
  880.   0       ja         ja         ja         kein Fehler
  881.  -1       ja         ja         ja         kein Grafikmodus aktiviert
  882.  -2       ja         ja         ja         kein Maustreiber installiert
  883.  -3       ja         ja         ja         unerlaubte Koordinatenangaben
  884.  -4      nein        ja        nein        unerlaubte Ebenen-Nr. angegeben
  885.  -5      nein        ja        nein        unerlaubte Button-Nr. angegeben
  886.  -6      nein        ja        nein        doppelte Button-Deklaration
  887.  -7      nein        ja        nein        keine aktuelle Ebene ausgewählt
  888.  -8      nein       nein        ja         unerlaubte Menü (X/Y) Position
  889.  -9      nein       nein        ja         Menüeintrag ist zu lang
  890. -10      nein       nein        ja         Menü ist nicht eingeschaltet
  891. -11      nein       nein        ja         kein Menüeintrag ist vorhanden
  892. -12      nein       nein        ja         unerlaubter Markierungswert
  893. -13      nein       nein        ja         kein Menü ist heruntergeklappt
  894. -14      nein       nein        ja         unerlaubter Revertmodus
  895. -15      nein       nein        ja         nur nach MENUPULL: kein Speicher
  896.  
  897. Die Fehlercodes der WINLIB:
  898.  
  899.   windowerror   Bedeutung
  900.  
  901.        0        kein Fehler
  902.       -1        ungültige Koordinaten
  903.       -2        alle Fenster belegt (=> 10 Fenster offen)
  904.       -3        kein Speicher (Fenster zu groß oder Heap voll)
  905.       -4        unzulässiger Farbcode
  906.       -5        unerlaubte Windownummer (wurde nicht vergeben)
  907.       -6        Window ist nicht offen
  908.  
  909.  
  910. Hier endet die Beschreibung der 30 öffentlichen und der 4 nicht-öffentlichen
  911. Prozeduren der 4 Units MOUSELIB/BUTLIB/MENULIB/WINLIB des MBM-PAKETES V 4.1
  912.  
  913. Das wars - ich hoffe nicht zu ausführlich und nicht zu knapp.
  914. Und nun noch: Viel Erfolg.
  915.